/**
 * @description: 处理当前需要合并的列的数据
 * @param {String} key - 当前需要处理的列
 * @param {Array} data - 当前列的数据
 * @param {String} numKey - 根据当前键的值统计出该对象在数组中出现的次数
 * @returns arrData - 当前处理后的列数据
 */
const rowSpan = (key, data, numKey) => {
  const arrData = data
    .reduce((result, item) => {
      if (result.indexOf(item[key]) < 0) {
        result.push(item[key]);
      }
      return result;
    }, [])
    .reduce((results, keys) => {
      const children = data.filter((item) => item[key] === keys);
      // 统计出数组中每个对象的numKey各个值的个数
      const numKeyCount = countNumberGoals(children, numKey);
      // 根据numKey每个值出现的次数将children分割成多个数组
      let numKeyArray = [];
      numKeyCount.forEach((item) => {
        numKeyArray.push(children.splice(0, item));
      });
      numKeyArray.forEach((item) => {
        results = results.concat(
          item.map((el, index) => {
            el[`${key}RowSpan`] = index === 0 ? item.length : 0;
            return el;
          })
        );
      });
      return results;
    }, []);
  return arrData;
};

/**
 * @description: 统计数组中某个键值相同的对象出现的个数
 * @param {Array} arrayData - 数组数据
 * @param {String} key - 对象的键，用于统计次数
 * @returns Array - key等于某个值出现的次数组成的数组
 */
function countNumberGoals(arrayData, key) {
  if (!key) {
    return [arrayData.length];
  }
  let arr = JSON.parse(JSON.stringify(arrayData));
  let newArray = [];
  let obj = {};
  for (var i = 0; i < arr.length; i++) {
    let temp = arr[i][key];
    let count = 0;
    for (var j = 0; j < arr.length; j++) {
      if (arr[j][key] === temp) {
        count++;
        arr[j][key] = -1;
      }
    }
    if (temp !== -1) {
      newArray.push(count);
      // obj[temp] = count;
    }
  }
  return newArray;
}

/**
 * @description: 拿到当前需要处理的列及对应的数据
 * @param {Array} dataList - 数据列表（数组或对象）
 * @param {String} rowIndex - 需要合并的列下标
 * @param {String} dataIndex - 若dataList为对象，则dataIndex为需要处理的列表数据对应的键名
 * @param {String} numKey - 根据当前键的值统计出该对象在数组中出现的次数
 * @returns
 */
const mergeRowSpan = (dataList, rowIndex, dataIndex, numKey) => {
  if (dataIndex) {
    dataList.forEach((item, index) => {
      dataList[index][dataIndex] = rowSpan(rowIndex, item[dataIndex], numKey);
    });
  } else {
    rowSpan(rowIndex, dataList);
  }
};

export { rowSpan, mergeRowSpan };